#include "mbappwig.h"
#include "ui_mbappwig.h"

#include "modbuswig.h"
#include <QRegExp>
#include <QDebug>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
MbappWig::MbappWig(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MbappWig)
{
    ui->setupUi(this);

    //按钮连接信号



}

MbappWig::~MbappWig()
{
    delete ui;
}

/*----------------订阅stm32消息处理函数------------------------*/
void MbappWig::stm32DataUpSlot(QByteArray jsonData) {
    qDebug() << "-------进入stm32处理---------";

    QJsonDocument doc = QJsonDocument::fromJson(jsonData);
    if (doc.isNull() || doc.isEmpty()) {
        qDebug() << "-----stm32数据解析失败--------";
        return;
    }


    // 首先判断是否为对象类型
    if (!doc.isObject()) {
        qDebug() << "-----JSON数据不是对象类型--------";
        return;
    }

    QJsonObject rootObj = doc.object();


    // 判断是否包含type字段，且type值为1
    if (!rootObj.contains("type") || rootObj["type"].toInt() != 1) {
        qDebug() << "-----type值不为1，不处理该消息--------";
        return;
    }

    // 仅当type为1时才继续处理数据
    if (rootObj.contains("data") && rootObj["data"].isArray()) {
        QJsonArray dataArray = rootObj["data"].toArray();

        for (int i = 0; i < dataArray.size(); ++i) {
            const QJsonValue &item = dataArray.at(i);
            if (item.isObject()) {
                QJsonObject sensor = item.toObject();
                int key = sensor["key"].toInt();
                QString valStr = sensor["val"].toString();

                switch (key) {
                case 101: { /*红外人体*/
                    if(valStr == "true"){
                        ui->humanButton->setChecked(true);
                        qDebug()<<"有人";
                    } else if(valStr == "false") {
                        ui->humanButton->setChecked(false);
                        qDebug()<<"没人";
                    }
                    break;
                }
                case 102:{
                    /*蜂鸣器报警*/
                    if(valStr == "true"){
                        ui->warnningButton->setChecked(true);
                        qDebug()<<"警报";
                    } else if(valStr == "false") {
                        ui->warnningButton->setChecked(false);
                        qDebug()<<"正常";
                    }
                    break;
                }
                case 103:{
                    /*灯*/
                    if(valStr == "true"){
                        ui->lightButton->setChecked(true);
                        qDebug()<<"开灯";
                    } else if(valStr == "false") {
                        ui->lightButton->setChecked(false);
                        qDebug()<<"关灯";
                    }
                    break;
                }
                case 104: { /* 温度处理 */
                    ui->tempEdit->setText(valStr);
                    qDebug()<<"温度是:"<<valStr<<"℃";
                     break;
                }
                case 105: {/* 湿度处理 */
                    ui->humEdit->setText(valStr);
                    qDebug()<<"湿度是:"<<valStr<<"%";
                     break;
                }
                case 106:{ /*风机*/
                    if(valStr == "true"){
                        ui->FanButton->setChecked(true);
                        qDebug()<<"打开风机";
                    } else if(valStr == "false") {
                        ui->FanButton->setChecked(false);
                        qDebug()<<"关闭风机";
                    }
                    break;
                }
                case 107:{ /*水泵*/
                    if(valStr == "true"){
                        ui->pumpButton->setChecked(true);
                        qDebug()<<"打开水泵";
                    } else if(valStr == "false") {
                        ui->pumpButton->setChecked(false);
                        qDebug()<<"关闭水泵";
                    }
                    break;
                }
                case 108:{ /*火焰传感*/
                    if(valStr == "true"){
                        ui->fireButton->setChecked(true);
                        qDebug()<<"着火";
                    } else if(valStr == "false") {
                        ui->fireButton->setChecked(false);
                        qDebug()<<"没火焰";
                    }
                    break;
                }
                case 109:{/*空气质量*/
                    ui->quartityLabel->setText(valStr);
                    qDebug()<<"空气质量:"<<valStr;
                     break;
                }
                    // ... 其他 case ...
                    default: break;
                }
            }
        }
    } else {
        qDebug() << "-----消息中不包含有效的data数组--------";
    }
}


void MbappWig::on_pushButton_2_clicked()
{
    // 显示历史温度界面
    temhisin.show();

}


/*===================================控制部分==========================*/
/*----------------------发布主题处理------------------------*/
//功能：实现数据的下发
//参数：
//      @key：要设置的设备的key值
//      @val：要下发的设备的控制指令，如true\false
//      @topic：要发布的主题
//返回值 无
void MbappWig::dataDownSlot(QString key,QString val){
    //创建json数据
    QJsonObject jsonData;

    jsonData["key"] = key;
    jsonData["val"] = val;

    //转化为JSON字符串·
    QJsonDocument jsonDoc(jsonData);
    QByteArray payload = jsonDoc.toJson(QJsonDocument::Compact);

    //发布消息
    QMQTT::Message message;
    message.setTopic("app/data/down");
    message.setPayload(payload);

    quint16 messageId = GlobalVal::mqtt->publish(message);
}

void MbappWig::modeDownslot(int type,int period)
{
    QJsonObject modeData;
    modeData["type"] = type;
    modeData["period"] = period;

    QJsonObject jsonMode;
    jsonMode["type"] = 3;
    jsonMode["data"] = modeData;

    QJsonDocument jsonMod(jsonMode);
    QByteArray payload = jsonMod.toJson(QJsonDocument::Compact);

    //发布消息
    QMQTT::Message message;
    message.setTopic("app/data/down");
    message.setPayload(payload);

    quint16 messageId = GlobalVal::mqtt->publish(message);
}


//命令
//风机打开
void MbappWig::on_humButtonBox_accepted()
{
    dataDownSlot("106","true");
    qDebug()<<"fan open pub";
}

//风机关闭
void MbappWig::on_humButtonBox_rejected()
{

        dataDownSlot("106","false");
        qDebug()<<"fan close pub";

}
//水泵打开
void MbappWig::on_motorbuttonBox_accepted()
{

        dataDownSlot("107","true");
        qDebug()<<"pump open pub";

}

//水泵关闭
void MbappWig::on_motorbuttonBox_rejected()
{
    dataDownSlot("107","false");
    qDebug()<<"pump close pub";
}

//照明打开
void MbappWig::on_lightbuttonBox_accepted()
{
    dataDownSlot("103","true");
    qDebug()<<"light open pub";
}
//照明关闭
void MbappWig::on_lightbuttonBox_rejected()
{
    dataDownSlot("103","true");
    qDebug()<<"light close pub";
}

//警报打开
void MbappWig::on_warningbuttonBox_accepted()
{
    dataDownSlot("102","true");
    qDebug()<<"warning open pub";
}


//警报关闭
void MbappWig::on_warningbuttonBox_rejected()
{
    dataDownSlot("102","false");
    qDebug()<<"warning close pub";
}



//不上报
void MbappWig::on_mode0Button_clicked()
{
    modeDownslot(0,5);
    qDebug()<<"mode0 pub";
}


void MbappWig::on_mode1Button_clicked()
{
    // 1. 读取输入框文本并转换为整数（带错误检查）
    bool ok;
    int time = ui->modeEdit->text().toInt(&ok);
    // 2. 检查转换结果和数值有效性
    if (!ok) {
        qDebug() << "错误：输入的不是有效的整数！";
        // 可添加UI提示，例如弹窗提醒用户
        QMessageBox::warning(this, "输入错误", "请输入有效的整数作为周期！");
        return; // 转换失败则不执行后续操作
    }
    // 3. （可选）根据业务需求限制数值范围（例如周期不能为负数）
    if (time < 0) {
        qDebug() << "错误：周期不能为负数！";
        QMessageBox::warning(this, "范围错误", "周期不能为负数，请重新输入！");
        return;
    }
    // 4. 调用槽函数（注意：若modeDownslot参数为qint8，需确保time在-128~127范围内）
    modeDownslot(1, time);
    // 5. 调试输出（修正qDebug的括号）
    qDebug() << "mode1 period" << time << "pub"; // 注：原拼写"preiod"修正为"period"
}


void MbappWig::on_mode2Button_clicked()
{
    modeDownslot(2,2);
    qDebug()<<"mode2 pub";
}
